const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
const _ = require('koa-route')
const jwt = require('jsonwebtoken')
const app = new Koa()
app.listen(3000, () => console.log('http://localhost:3000'))
app.use(bodyParser())

let secrectkey = 'fewjfoewfjlkefjewljflewefjlkewjfklwf'

app.use(_.post('/login', async ctx => {
  let uid = 1000
  // 得到账号和密码，验证是否正确
  let { username } = ctx.request.body
  // 验证通过
  // token过期时间为2小时
  let exp = Date.now() + 3600 * 2 * 1000

  // 生成token 用于发送给客户端来进行状态的保持
  // token中的payload中数据 uid username exp
  let token = jwt.sign({
    uid,
    username,
    exp
  }, secrectkey)

  // 把token值响应给客户端
  ctx.body = token

}))


app.use(_.post('/users', async ctx => {
  let users = [{ id: 1, name: 'lisi' }, { id: 2, name: 'zs' }]

  // 接受token数据,验证token中的数据是否合法，如果合法则返回数据，如果不合法则不返回数据
  // 客户端会通过请求头中携带token传给服务器
  let token = ctx.request.headers.token
  // 解密token 返回对象
  // let deToken = jwt.verify(token, secrectkey)
  try {
    let { uid, username, exp } = jwt.verify(token, secrectkey)
    // 验证合法性
    if (Date.now() > exp) {
      ctx.status = 401
      ctx.body = { code: 1000, msg: 'token过期' }
    } else {
      // 根据uid查询数据库，看看有没有记录，如果有则比对username值是否和解密的username值一致
      ctx.body = users
    }
  } catch (error) {
    ctx.status = 403
    ctx.body = { code: 1001, msg: '非法请求' }
  }
}))
